#ifndef __BRD_HLW8112_H
#define __BRD_HLW8112_H

//----------------------------------Include-------------------------------------
#include <stdint.h>
//------------------------------------------------------------------------------

//-----------------------------------Macro--------------------------------------
//校表参数和计量控制寄存器
//名称               地址    字长    复位值  写保护  RW    功能描述
#define SYSCON       0x00    //2      0A04h    Yes   R/W   系统控制寄存器
#define EMUCON       0x01    //2      0000h    Yes   R/W   计量控制寄存器
#define HFConst      0x02    //2      1000h    Yes   R/W   脉冲频率寄存器
#define Pastart      0x03    //2      0060h    Yes   R/W   通道 A 有功起动功率设置
#define Pbstart      0x04    //2      0060h    Yes   R/W   通道 B 有功起动功率设置
#define PAGain       0x05    //2      0000h    Yes   R/W   通道 A 功率增益校准寄存器
#define PBGain       0x06    //2      0000h    Yes   R/W   通道 B 功率增益校准寄存器
#define PhaseA       0x07    //1        00h    Yes   R/W   通道 A 相位校准寄存器
#define PhaseB       0x08    //1        00h    Yes   R/W   通道 B 相位校准寄存器
#define PAOS         0x0A    //2      0000h    Yes   R/W   通道 A 有功功率 Offset 校准
#define PBOS         0x0B    //2      0000h    Yes   R/W   通道 B 有功功率 Offset 校准
#define RmsIAOS      0x0E    //2      0000h    Yes   R/W   电流通道 A 有效值 Offset 补偿
#define RmsIBOS      0x0F    //2      0000h    Yes   R/W   电流通道 B 有效值 Offset 补偿
#define IBGain       0x10    //2      0000h    Yes   R/W   电流通道 B 增益设置
#define PSGain       0x11    //2      0000h    Yes   R/W   视在功率增益校准
#define PSOS         0x12    //2      0000h    Yes   R/W   视在功率 Offset 补偿
#define EMUCON2      0x13    //2      0001h    Yes   R/W   计量控制寄存器 2
#define DCIA         0x14    //2      0000h    Yes   R/W   IA 通道直流 offset 校正寄存器
#define DCIB         0x15    //2      0000h    Yes   R/W   IB 通道直流 offset 校正寄存器
#define DCIC         0x16    //2      0000h    Yes   R/W   U  通道直流 offset 校正寄存器
#define SAGCYC       0x17    //2      0000h    Yes   R/W   电压骤降周期设置
#define SAGLVL       0x18    //2      0000h    Yes   R/W   电压骤降阈值设置
#define OVLVL        0x19    //2      FFFFh    Yes   R/W   电压过压阈值设置
#define OIALVL       0x1A    //2      FFFFh    Yes   R/W   电流通道 A 过流阈值设置
#define OIBLVL       0x1B    //2      FFFFh    Yes   R/W   电流通道 B 过流阈值设置
#define OPLVL        0x1C    //2      FFFFh    Yes   R/W   有功功率过载阈值设置
#define INT          0x1D    //2      3210h    Yes   R/W   INT1/INT2 分别默认输出 PFA/PFB

//计量参数和状态寄存器
//名称               地址    字长    复位值  写保护  RW   功能描述
#define PFCntPA      0x20    //2      0000h    Yes   R/W  通道 A 快速组合有功脉冲计数
#define PFCntPB      0x21    //2      0000h    Yes   R/W  通道 B 快速组合有功脉冲计数
#define Angle        0x22    //2      0000h    -     R    电流与电压之间的相角，通过命令选择电流通道 A 或 B 与电压通道的相角
#define Ufreq        0x23    //2      0000h    -     R    电压频率，更新速率 3.4/6.8/13.6/27.3Hz
#define RmsIA        0x24    //3    000000h    -     R    通道 A 电流有效值，更新速率 3.4/6.8/13.6/27.3Hz
#define RmsIB        0x25    //3    000000h    -     R    通道 B 电流有效值，更新速率 3.4/6.8/13.6/27.3Hz
#define RmsU         0x26    //3    000000h    -     R    电压有效值
#define PowerFactor  0x27    //3    7FFFFFh    -     R    功率因数，通过命令选择：通道 A 或 B 的功率因数
#define Energy_PA    0x28    //3    000000h    -     R    通道 A 有功电能，默认为读后清零，可配置为读后不清零
#define Energy_PB    0x29    //3    000000h    -     R    通道 B 有功电能，默认为读后清零，可配置为读后不清零
#define PowerPA      0x2C    //4  00000000h    -     R    通道 A 有功功率，更新速率 3.4/6.8/13.6/27.3Hz
#define PowerPB      0x2D    //4  00000000h    -     R    通道 B 有功功率，更新速率 3.4/6.8/13.6/27.3Hz
#define PowerS       0x2E    //4  00000000h    -     R    视在功率，通过命令选择通道 A 或 B 的视在功率，更新速率 3.4/6.8/13.6/27.3Hz
#define EMUStatus    0x2F    //3    00B32Fh    -     R    计量状态及校验和寄存器
#define PeakIA       0x30    //3    000000h    -     R    电流通道 A 的峰值，50Hz 线性频率下，更新速率 10ms
#define PeakIB       0x31    //3    000000h    -     R    电流通道 B 的峰值，50Hz 线性频率下，更新速率 10ms
#define PeakU        0x32    //3    000000h    -     R    电压通道 U 的峰值，50Hz 线性频率下，更新速率 10ms
#define InstanIA     0x33    //3    000000h    -     R    电流通道 A 瞬时值
#define InstanIB     0x34    //3    000000h    -     R    电流通道 B 瞬时值
#define InstanU      0x35    //3    000000h    -     R    电压通道瞬时值
#define WaveIA       0x36    //3    000000h          R    电流通道 A 波形
#define WaveIB       0x37    //3    000000h          R    电流通道 B 波形
#define WaveU        0x38    //3    000000h          R    电压通道波形
#define InstanP      0x3C    //4  00000000h    -     R    有功功率瞬时值，通过命令选择通道 A 或 B 的有功功率瞬时值
#define InstanS      0x3D    //4  00000000h    -     R    视在功率瞬时值，通过命令选择通道 A 或 B 的视在功率瞬时值

//中断寄存器
//名称               地址    字长    复位值  写保护  RW   功能描述
#define IE           0x40    //2      0000h    Yes   R/W  中断允许寄存器
#define IF           0x41    //2      0000h    -     R    中断标志寄存器 （不可写）
#define RIF          0x42    //2      0000h    -     R    复位中断状态寄存器

//系统状态寄存器
//名称               地址    字长    复位值  写保护  RW   功能描述
#define SysStatus    0x43    //1        --     -     R    系统状态寄存器
#define Rdata        0x44    //4        --     -     R    上一次 SPI 读出的数据
#define Wdata        0x45    //2        --     -     R    上一次 SPI 写入的数据
#define CHECKSUM     0x6F    //2        --                校表系数校验和
#define RmsIAC       0x70    //2        --     -     R    电流通道 A 有效值转换系数
#define RmsIBC       0x71    //2        --     -     R    电流通道 B 有效值转换系数
#define RmsUC        0x72    //2        --     -     R    电压通道 U 有效值转换系数
#define PowerPAC     0x73    //2        --     -     R    电流通道 A 有功功率转换系数
#define PowerPBC     0x74    //2        --     -     R    电流通道 B 有功功率转换系数
#define PowerSC      0x75    //2        --     -     R    视在功率转换系数
#define EnergyAC     0x76    //2        --     -     R    A 通道能量转换系数
#define EnergyBC     0x77    //2        --     -     R    B 通道能量转换系数
#define Trim_RC      0x7C    //2     0210h           R    高 3 位保留；低 13 位为内置时钟 Trim 寄存器
#define Trim_Vref    0x7D    //2     0000h           R    内置 VrefTrim 寄存器
//------------------------------------------------------------------------------

//----------------------------------Declare-------------------------------------
void     brd_init_hlw8112(void);
//------------------------------------------------------------------------------
uint32_t brd_hlw8112_rd_reg(uint8_t addr, uint8_t len);
void     brd_hlw8112_wr_reg(uint8_t addr, uint32_t para, uint8_t len);
//------------------------------------------------------------------------------

#endif
//------------------------------------EOF---------------------------------------

